Ensure we initialise the cpu_present_map before
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 15 Nov 2005 17:43:28 +0000 (18:43 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 15 Nov 2005 17:43:28 +0000 (18:43 +0100)
topology_init() is called. In latest Linux kernels it
iterates over cpu_present_map rather than cpu_possible_map.

Also, save/restore should really iterate over
possible cpus, not present ones (not that it really matters,
but it's a small cleanup).

Signed-off-by: Keir Fraser <keir@xensource.com>
linux-2.6-xen-sparse/arch/xen/kernel/reboot.c
linux-2.6-xen-sparse/arch/xen/kernel/smpboot.c

index 89c20054508d6381e8b3d0010dd8be6dedf9033a..81f0f10c21de0b62edac562c2b1b87d88988a451 100644 (file)
@@ -188,7 +188,7 @@ static int __do_suspend(void *ignore)
        xenbus_resume();
 
 #ifdef CONFIG_SMP
-       for_each_present_cpu(i)
+       for_each_cpu(i)
                vcpu_prepare(i);
 
  out_reenable_cpus:
index 31ea6473f1ca0a8beb5bdfbc202dd133ed6ddc83..66bb891ec6a7c236519fed306ec0cccd9a2b1cd5 100644 (file)
@@ -277,6 +277,18 @@ void __devinit smp_prepare_boot_cpu(void)
 
 #ifdef CONFIG_HOTPLUG_CPU
 
+/*
+ * Initialize cpu_present_map late to skip SMP boot code in init/main.c.
+ * But do it early enough to catch critical for_each_present_cpu() loops
+ * in i386-specific code.
+ */
+static int __init initialize_cpu_present_map(void)
+{
+       cpu_present_map = cpu_possible_map;
+       return 0;
+}
+core_initcall(initialize_cpu_present_map);
+
 static void vcpu_hotplug(unsigned int cpu)
 {
        int err;
@@ -293,7 +305,6 @@ static void vcpu_hotplug(unsigned int cpu)
        }
 
        if (strcmp(state, "online") == 0) {
-               cpu_set(cpu, cpu_present_map);
                (void)cpu_up(cpu);
        } else if (strcmp(state, "offline") == 0) {
                (void)cpu_down(cpu);